This script further analyzed the wt cells that are not from the Shh lineage.
library(dplyr)
library(Matrix)
library(Seurat)
load("seuratE15E16P1P4_wt.RData")
seurat_E15E16P1P4_wt<-SetAllIdent(object = seurat_E15E16P1P4_wt, id = "res.1.4")
E15E16P1P4_wt_nonShh = SubsetData(object=seurat_E15E16P1P4_wt,ident.use=c(26,10,12,6,0,17,18,21,14,31,23,33,22,25,5,4,13,15,19,16),min.cells = 1,min.genes = 1,project="E15Oct10_E16Dec7_P1Dec11_P4Oct18_wt_nonShh")
change metadata annotation to reflect the original (old, from seurat_E15E16P1P4_wt) or new (non-Shh) results:
colnames(E15E16P1P4_wt_nonShh@meta.data)[colnames(E15E16P1P4_wt_nonShh@meta.data) == 'res.0.8'] <- 'orig.0.8'
colnames(E15E16P1P4_wt_nonShh@meta.data)[colnames(E15E16P1P4_wt_nonShh@meta.data) == 'res.1.4'] <- 'orig.1.4'
colnames(E15E16P1P4_wt_nonShh@meta.data)[colnames(E15E16P1P4_wt_nonShh@meta.data) == 'res.1.6'] <- 'orig.1.6'
colnames(E15E16P1P4_wt_nonShh@meta.data)[colnames(E15E16P1P4_wt_nonShh@meta.data) == 'CellCycle_score'] <- 'orig.CellCycle_score'
colnames(E15E16P1P4_wt_nonShh@meta.data)[colnames(E15E16P1P4_wt_nonShh@meta.data) == 'mucosaGoblet_score'] <- 'orig.mucosaGoblet_score'
colnames(E15E16P1P4_wt_nonShh@meta.data)[colnames(E15E16P1P4_wt_nonShh@meta.data) == 'ciliopathy_score'] <- 'orig.ciliopathy_score'
colnames(E15E16P1P4_wt_nonShh@meta.data)[colnames(E15E16P1P4_wt_nonShh@meta.data) == 'PCD_score'] <- 'orig.PCD_score'
colnames(E15E16P1P4_wt_nonShh@meta.data)[colnames(E15E16P1P4_wt_nonShh@meta.data) == 'Bronchiectasis_Bronchitis'] <- 'orig.Bronchiectasis_Bronchitis_score'
E15E16P1P4_wt_nonShh <- ScaleData(object = E15E16P1P4_wt_nonShh)
Scaling data matrix
|
| | 0%
|
|======= | 5%
|
|============== | 9%
|
|===================== | 14%
|
|============================ | 18%
|
|=================================== | 23%
|
|========================================== | 27%
|
|================================================= | 32%
|
|======================================================== | 36%
|
|=============================================================== | 41%
|
|====================================================================== | 45%
|
|============================================================================= | 50%
|
|==================================================================================== | 55%
|
|=========================================================================================== | 59%
|
|================================================================================================== | 64%
|
|========================================================================================================= | 68%
|
|================================================================================================================ | 73%
|
|======================================================================================================================= | 77%
|
|============================================================================================================================== | 82%
|
|===================================================================================================================================== | 86%
|
|============================================================================================================================================ | 91%
|
|=================================================================================================================================================== | 95%
|
|==========================================================================================================================================================| 100%
E15E16P1P4_wt_nonShh <- FindVariableGenes(object = E15E16P1P4_wt_nonShh, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
Calculating gene means
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

E15E16P1P4_wt_nonShh <- RunPCA(object = E15E16P1P4_wt_nonShh,pcs.compute = 30, do.print = FALSE)
E15E16P1P4_wt_nonShh <- ProjectPCA(object = E15E16P1P4_wt_nonShh, do.print = FALSE)
PCHeatmap(object = E15E16P1P4_wt_nonShh, pc.use = c(1:12), cells.use = 500, do.balanced = TRUE, label.columns = FALSE, num.genes = 30)

PCElbowPlot(object = E15E16P1P4_wt_nonShh,num.pc = 30)

n.pcs = 27
res.used <- 0.8
E15E16P1P4_wt_nonShh <- FindClusters(object = E15E16P1P4_wt_nonShh, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE)
E15E16P1P4_wt_nonShh <- RunTSNE(object = E15E16P1P4_wt_nonShh, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2)
TSNEPlot(object = E15E16P1P4_wt_nonShh, do.label = T,pt.size = 0.2,group.by="res.0.8")

TSNEPlot(object = E15E16P1P4_wt_nonShh, do.label = F,group.by="seq_group",pt.size = 0.2)


res.used <- 1.0
E15E16P1P4_wt_nonShh <- FindClusters(object = E15E16P1P4_wt_nonShh, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE)
Build parameters exactly match those of already computed and stored SNN. To force recalculation, set force.recalc to TRUE.
E15E16P1P4_wt_nonShh <- RunTSNE(object = E15E16P1P4_wt_nonShh, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=10)
TSNEPlot(object = E15E16P1P4_wt_nonShh, do.label = T,pt.size = 0.2,group.by="res.1")

res.used <- 1.2
E15E16P1P4_wt_nonShh <- FindClusters(object = E15E16P1P4_wt_nonShh, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE)
Build parameters exactly match those of already computed and stored SNN. To force recalculation, set force.recalc to TRUE.
E15E16P1P4_wt_nonShh <- RunTSNE(object = E15E16P1P4_wt_nonShh, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=10)
TSNEPlot(object = E15E16P1P4_wt_nonShh, do.label = T,pt.size = 0.2,group.by="res.1.2")


res.used <- 1.6
E15E16P1P4_wt_nonShh <- FindClusters(object = E15E16P1P4_wt_nonShh, reduction.type = "pca", dims.use = 1:n.pcs,
resolution = res.used, print.output = 0, save.SNN = TRUE)
Build parameters exactly match those of already computed and stored SNN. To force recalculation, set force.recalc to TRUE.
E15E16P1P4_wt_nonShh <- RunTSNE(object = E15E16P1P4_wt_nonShh, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=10)
TSNEPlot(object = E15E16P1P4_wt_nonShh, do.label = T,pt.size = 0.2,group.by="res.1.6")


We will use resolution=1.6 for the rest of the analysis.
E15E16P1P4_wt_nonShh <- SetAllIdent(object = E15E16P1P4_wt_nonShh, id = "res.1.6")
E15E16P1P4_wt_nonShh_res16_c31<-FindMarkers(E15E16P1P4_wt_nonShh,ident.1=c(31),only.pos = TRUE)
| | 0 % ~calculating
|++ | 4 % ~05s
|++++ | 7 % ~05s
|++++++ | 11% ~04s
|++++++++ | 15% ~04s
|++++++++++ | 19% ~04s
|++++++++++++ | 22% ~04s
|+++++++++++++ | 26% ~03s
|+++++++++++++++ | 30% ~03s
|+++++++++++++++++ | 33% ~03s
|+++++++++++++++++++ | 37% ~03s
|+++++++++++++++++++++ | 41% ~03s
|+++++++++++++++++++++++ | 44% ~02s
|+++++++++++++++++++++++++ | 48% ~02s
|++++++++++++++++++++++++++ | 52% ~02s
|++++++++++++++++++++++++++++ | 56% ~02s
|++++++++++++++++++++++++++++++ | 59% ~02s
|++++++++++++++++++++++++++++++++ | 63% ~02s
|++++++++++++++++++++++++++++++++++ | 67% ~01s
|++++++++++++++++++++++++++++++++++++ | 70% ~01s
|++++++++++++++++++++++++++++++++++++++ | 74% ~01s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~01s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~01s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~01s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 04s
E15E16P1P4_wt_nonShh_res16_c31
So cluster 31 is likely to be RBC.
library(plyr)
E15E16P1P4_wt_nonShh@meta.data$cell_type_1.6<-mapvalues(E15E16P1P4_wt_nonShh@meta.data$res.1.6,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32"),to=c("Fibroblast","CyclingFibroblast","Chondrocyte","Fibroblast","Fibroblast","Fibroblast","Fibroblast","Fibroblast","Fibroblast","Fibroblast","CyclingFibroblast","Immune_1","CyclingFibroblast","Muscle","Fibroblast","VascularEndothelial","Muscle","MesenchymalProgenitor","Fibroblast","Chondrocyte","Immune_2","Chondrocyte","CyclingFibroblast","LymphaticEndothelial","Muscle","MesenchymalProgenitor","MesenchymalProgenitor","SchwannCell","MesenchymalProgenitor","VSMC/pericyte","Muscle","RBC","Neuron/NEC"))
wt_nonShh_cellType1.6<-E15E16P1P4_wt_nonShh@meta.data$cell_type_1.6
names(wt_nonShh_cellType1.6)<-E15E16P1P4_wt_nonShh@cell.names
#load("seuratE15E16P1P4_wt_nonShh.RData")

For the purpose of visualization, we average within each cell type:
E15E16P1P4_wt_nonShh<-SetAllIdent(object = E15E16P1P4_wt_nonShh, id = "cell_type_1.6")
average_wt_nonShh_res1.6_Annotation<-AverageExpression(object = E15E16P1P4_wt_nonShh,return.seurat = T)
Finished averaging RNA for cluster Chondrocyte
Finished averaging RNA for cluster CyclingFibroblast
Finished averaging RNA for cluster Fibroblast
Finished averaging RNA for cluster Immune_1
Finished averaging RNA for cluster Immune_2
Finished averaging RNA for cluster LymphaticEndothelial
Finished averaging RNA for cluster MesenchymalProgenitor
Finished averaging RNA for cluster Muscle
Finished averaging RNA for cluster Neuron/NEC
Finished averaging RNA for cluster RBC
Finished averaging RNA for cluster SchwannCell
Finished averaging RNA for cluster VascularEndothelial
Finished averaging RNA for cluster VSMC/pericyte
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Scaling data matrix
|
| | 0%
|
|==========================================================================================================================================================| 100%


table(E15E16P1P4_wt_nonShh@meta.data$age[!(E15E16P1P4_wt_nonShh@meta.data$res.1.6 %in% c(31))],E15E16P1P4_wt_nonShh@meta.data$cell_type_1.6[!(E15E16P1P4_wt_nonShh@meta.data$res.1.6 %in% c(31))])
Chondrocyte CyclingFibroblast Fibroblast Immune_1 Immune_2 LymphaticEndothelial MesenchymalProgenitor Muscle Neuron/NEC SchwannCell VascularEndothelial
E15 326 320 390 45 12 6 91 100 35 36 46
E16 617 810 2914 163 78 48 199 285 15 53 182
P1 8 328 914 112 42 53 113 183 0 5 19
P4 5 58 470 27 34 27 108 152 1 0 21
VSMC/pericyte
E15 10
E16 59
P1 10
P4 1
neuron/NEC, and if they are from E15 or P4, are they from Shh lineage (if from Shh lineage, they should be captured in the “green” gate):
scaled data:

unscaled data:

Schwann cell:

some lineage markers:

Chondrocytes across time:

library(ggalluvial)
Error in library(ggalluvial) : there is no package called ‘ggalluvial’

Don’t expect a lot of Col10a1 or Mmp13:


ggplot(data=E15E16P1P4_wt_nonShh@meta.data,aes(axis1=orig.1.4,axis2=res.1.6,axis3=cell_type_1.6))+geom_alluvium(aes(fill=res.1.6))+geom_stratum(width = 1/12, fill = "black", color = "grey") +geom_label(stat = "stratum", label.strata = TRUE)+scale_x_discrete(limits = c("orig.1.4", "res.1.6","cell_type_1.6"), expand = c(.05, .05))


LS0tCnRpdGxlOiAiVHJhY2hlYV9XVF8xMHhfbm9uU2hoIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCiMjIFRoaXMgc2NyaXB0IGZ1cnRoZXIgYW5hbHl6ZWQgdGhlIHd0IGNlbGxzIHRoYXQgYXJlIG5vdCBmcm9tIHRoZSBTaGggbGluZWFnZS4KYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoTWF0cml4KQpsaWJyYXJ5KFNldXJhdCkKYGBgCmBgYHtyfQpsb2FkKCJzZXVyYXRFMTVFMTZQMVA0X3d0LlJEYXRhIikKYGBgCgpgYGB7cn0Kc2V1cmF0X0UxNUUxNlAxUDRfd3Q8LVNldEFsbElkZW50KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBpZCA9ICJyZXMuMS40IikKI3Rha2Ugbm9uLVNoaCBjbHVzdGVyczoKRTE1RTE2UDFQNF93dF9ub25TaGggPSBTdWJzZXREYXRhKG9iamVjdD1zZXVyYXRfRTE1RTE2UDFQNF93dCxpZGVudC51c2U9YygyNiwxMCwxMiw2LDAsMTcsMTgsMjEsMTQsMzEsMjMsMzMsMjIsMjUsNSw0LDEzLDE1LDE5LDE2KSxtaW4uY2VsbHMgPSAxLG1pbi5nZW5lcyA9IDEscHJvamVjdD0iRTE1T2N0MTBfRTE2RGVjN19QMURlYzExX1A0T2N0MThfd3Rfbm9uU2hoIikKYGBgCiMjIyMjIGNoYW5nZSBtZXRhZGF0YSBhbm5vdGF0aW9uIHRvIHJlZmxlY3QgdGhlIG9yaWdpbmFsIChvbGQsIGZyb20gc2V1cmF0X0UxNUUxNlAxUDRfd3QpIG9yIG5ldyAobm9uLVNoaCkgcmVzdWx0czoKYGBge3J9CmNvbG5hbWVzKEUxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSlbY29sbmFtZXMoRTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhKSA9PSAncmVzLjAuOCddIDwtICdvcmlnLjAuOCcKY29sbmFtZXMoRTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhKVtjb2xuYW1lcyhFMTVFMTZQMVA0X3d0X25vblNoaEBtZXRhLmRhdGEpID09ICdyZXMuMS40J10gPC0gJ29yaWcuMS40Jwpjb2xuYW1lcyhFMTVFMTZQMVA0X3d0X25vblNoaEBtZXRhLmRhdGEpW2NvbG5hbWVzKEUxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSkgPT0gJ3Jlcy4xLjYnXSA8LSAnb3JpZy4xLjYnCmBgYAoKYGBge3J9CmNvbG5hbWVzKEUxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSlbY29sbmFtZXMoRTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhKSA9PSAnQ2VsbEN5Y2xlX3Njb3JlJ10gPC0gJ29yaWcuQ2VsbEN5Y2xlX3Njb3JlJwpjb2xuYW1lcyhFMTVFMTZQMVA0X3d0X25vblNoaEBtZXRhLmRhdGEpW2NvbG5hbWVzKEUxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSkgPT0gJ211Y29zYUdvYmxldF9zY29yZSddIDwtICdvcmlnLm11Y29zYUdvYmxldF9zY29yZScKY29sbmFtZXMoRTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhKVtjb2xuYW1lcyhFMTVFMTZQMVA0X3d0X25vblNoaEBtZXRhLmRhdGEpID09ICdjaWxpb3BhdGh5X3Njb3JlJ10gPC0gJ29yaWcuY2lsaW9wYXRoeV9zY29yZScKY29sbmFtZXMoRTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhKVtjb2xuYW1lcyhFMTVFMTZQMVA0X3d0X25vblNoaEBtZXRhLmRhdGEpID09ICdQQ0Rfc2NvcmUnXSA8LSAnb3JpZy5QQ0Rfc2NvcmUnCmNvbG5hbWVzKEUxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSlbY29sbmFtZXMoRTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhKSA9PSAnQnJvbmNoaWVjdGFzaXNfQnJvbmNoaXRpcyddIDwtICdvcmlnLkJyb25jaGllY3Rhc2lzX0Jyb25jaGl0aXNfc2NvcmUnCgpgYGAKCmBgYHtyfQpFMTVFMTZQMVA0X3d0X25vblNoaCA8LSBTY2FsZURhdGEob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgpCmBgYAoKCmBgYHtyfQpFMTVFMTZQMVA0X3d0X25vblNoaCA8LSBGaW5kVmFyaWFibGVHZW5lcyhvYmplY3QgPSBFMTVFMTZQMVA0X3d0X25vblNoaCwgZG8ucGxvdCA9IFRSVUUsIHgubG93LmN1dG9mZj0wLjEseC5oaWdoLmN1dG9mZiA9IEluZiwgeS5jdXRvZmYgPSAwLjUpCmBgYApgYGB7cn0KRTE1RTE2UDFQNF93dF9ub25TaGggPC0gUnVuUENBKG9iamVjdCA9IEUxNUUxNlAxUDRfd3Rfbm9uU2hoLHBjcy5jb21wdXRlID0gMzAsIGRvLnByaW50ID0gRkFMU0UpCkUxNUUxNlAxUDRfd3Rfbm9uU2hoIDwtIFByb2plY3RQQ0Eob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGRvLnByaW50ID0gRkFMU0UpCmBgYApgYGB7cixmaWcuaGVpZ2h0PTIwLGZpZy53aWR0aD04fQpQQ0hlYXRtYXAob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIHBjLnVzZSA9IGMoMToxMiksIGNlbGxzLnVzZSA9IDUwMCwgZG8uYmFsYW5jZWQgPSBUUlVFLCBsYWJlbC5jb2x1bW5zID0gRkFMU0UsIG51bS5nZW5lcyA9IDMwKQoKYGBgCgpgYGB7cn0KUENFbGJvd1Bsb3Qob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsbnVtLnBjID0gMzApCmBgYApgYGB7cn0Kbi5wY3MgPSAyNwpyZXMudXNlZCA8LSAwLjgKCkUxNUUxNlAxUDRfd3Rfbm9uU2hoIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBFMTVFMTZQMVA0X3d0X25vblNoaCwgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLCAKICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFKQpgYGAKYGBge3J9CkUxNUUxNlAxUDRfd3Rfbm9uU2hoIDwtIFJ1blRTTkUob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGRpbXMudXNlID0gMTpuLnBjcywgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT0zMCwgZGltLmVtYmVkID0gMixrLnBhcmFtPTEwKQoKYGBgCgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGRvLmxhYmVsID0gVCxwdC5zaXplID0gMC4yLGdyb3VwLmJ5PSJyZXMuMC44IikKCmBgYApgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGRvLmxhYmVsID0gRixncm91cC5ieT0ic2VxX2dyb3VwIixwdC5zaXplID0gMC4yKQoKYGBgCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBFMTVFMTZQMVA0X3d0X25vblNoaCwgZG8ubGFiZWwgPSBGLGdyb3VwLmJ5PSJhZ2UiLHB0LnNpemUgPSAwLjIpCgpgYGAKCmBgYHtyfQpyZXMudXNlZCA8LSAxLjAKCkUxNUUxNlAxUDRfd3Rfbm9uU2hoIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBFMTVFMTZQMVA0X3d0X25vblNoaCwgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLCAKICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFKQpgYGAKYGBge3J9CkUxNUUxNlAxUDRfd3Rfbm9uU2hoIDwtIFJ1blRTTkUob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGRpbXMudXNlID0gMTpuLnBjcywgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT0zMCwgZGltLmVtYmVkID0gMixrLnBhcmFtPTEwKQoKYGBgCgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGRvLmxhYmVsID0gVCxwdC5zaXplID0gMC4yLGdyb3VwLmJ5PSJyZXMuMSIpCgpgYGAKCmBgYHtyfQpyZXMudXNlZCA8LSAxLjIKCkUxNUUxNlAxUDRfd3Rfbm9uU2hoIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBFMTVFMTZQMVA0X3d0X25vblNoaCwgcmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOm4ucGNzLCAKICAgIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFKQpgYGAKYGBge3J9CkUxNUUxNlAxUDRfd3Rfbm9uU2hoIDwtIFJ1blRTTkUob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGRpbXMudXNlID0gMTpuLnBjcywgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT0zMCwgZGltLmVtYmVkID0gMixrLnBhcmFtPTEwKQoKYGBgCgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGRvLmxhYmVsID0gVCxwdC5zaXplID0gMC4yLGdyb3VwLmJ5PSJyZXMuMS4yIikKCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9MTUsZmlnLndpZHRoPTQwfQoKRG9IZWF0bWFwKG9iamVjdCA9IEUxNUUxNlAxUDRfd3Rfbm9uU2hoLCBnZW5lcy51c2UgPSBjKCJBbm8xIiwiQ2Z0ciIsIk1raTY3IiwiVG9wMmEiLCJTb3g5IiwiQ29sMTFhMSIsIkNvbDExYTIiLCJBY2FuIiwiQ29sMmExIiwiTWlhIiwiV2lmMSIsIldudDIiLCJDZDM0IiwiVGVrIiwiU21vYzIiLCJQaTE2IiwiTHk2YSIsIlRoeTEiLCJMdW0iLCJEY24iLCJQcHAxcjE0YSIsIkVkbnJiIiwiQ2RoNCIsIkFjdGEyIiwiVGFnbG4iLCJNeWgxMSIsIlJnczUiLCJOb3RjaDMiLCJDMXFhIiwiRmNlcjFnIiwiQ2QzZyIsIlBlY2FtMSIsIkx5dmUxIiwiQXNjbDEiLCJDaGdhIiwiVHViYjMiLCJTbmFwMjUiLCJQbHAxIiwiTXB6IiwiRGJpIiwiQWRpcG9xIiwiRmFicDQiLCJBbGFzMiIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0icmVzLjEuMiIsZ3JvdXAuY2V4ID0gMjUsY2V4LnJvdz0yNQogICkKYGBgCgpgYGB7cn0KcmVzLnVzZWQgPC0gMS42CgpFMTVFMTZQMVA0X3d0X25vblNoaCA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIHJlZHVjdGlvbi50eXBlID0gInBjYSIsIGRpbXMudXNlID0gMTpuLnBjcywgCiAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIHNhdmUuU05OID0gVFJVRSkKYGBgCmBgYHtyfQpFMTVFMTZQMVA0X3d0X25vblNoaCA8LSBSdW5UU05FKG9iamVjdCA9IEUxNUUxNlAxUDRfd3Rfbm9uU2hoLCBkaW1zLnVzZSA9IDE6bi5wY3MsIHNlZWQudXNlID0gMTAsIHBlcnBsZXhpdHk9MzAsIGRpbS5lbWJlZCA9IDIsay5wYXJhbT0xMCkKCmBgYAoKYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IEUxNUUxNlAxUDRfd3Rfbm9uU2hoLCBkby5sYWJlbCA9IFQscHQuc2l6ZSA9IDAuMixncm91cC5ieT0icmVzLjEuNiIpCgpgYGAKYGBge3IsZmlnLmhlaWdodD0xOCxmaWcud2lkdGg9NjB9CgpEb0hlYXRtYXAob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGdlbmVzLnVzZSA9IGMoIldudDIiLCJOcnAxIiwiVGVrIiwiTHk2YSIsIlRoeTEiLCJTb3g5IiwiQWNhbiIsIkNvbDJhMSIsIkFjdGEyIiwiVGFnbG4iLCJNeWgxMSIsIlBwcDFyMTRhIiwiUmdzNSIsIk5vdGNoMyIsIlBlY2FtMSIsIkx5dmUxIiwiRmNlcjFnIiwiQzFxYSIsIkNkM2ciLCJBZGlwb3EiLCJGYWJwNCIsIlBscDEiLCJNcHoiLCJBc2NsMSIsIkNoZ2EiLCJTbmFwMjUiLCJNa2k2NyIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0icmVzLjEuNiIsZ3JvdXAuY2V4ID0gMzAsY2V4LnJvdz0zNQogICkKYGBgCgojIyMjIyBXZSB3aWxsIHVzZSByZXNvbHV0aW9uPTEuNiBmb3IgdGhlIHJlc3Qgb2YgdGhlIGFuYWx5c2lzLgoKYGBge3J9CkUxNUUxNlAxUDRfd3Rfbm9uU2hoIDwtIFNldEFsbElkZW50KG9iamVjdCA9IEUxNUUxNlAxUDRfd3Rfbm9uU2hoLCBpZCA9ICJyZXMuMS42IikKCkUxNUUxNlAxUDRfd3Rfbm9uU2hoX3JlczE2X2MzMTwtRmluZE1hcmtlcnMoRTE1RTE2UDFQNF93dF9ub25TaGgsaWRlbnQuMT1jKDMxKSxvbmx5LnBvcyA9IFRSVUUpCkUxNUUxNlAxUDRfd3Rfbm9uU2hoX3JlczE2X2MzMQpgYGAKIyMjIyMgU28gY2x1c3RlciAzMSBpcyBsaWtlbHkgdG8gYmUgUkJDLgoKYGBge3J9CmxpYnJhcnkocGx5cikKRTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhJGNlbGxfdHlwZV8xLjY8LW1hcHZhbHVlcyhFMTVFMTZQMVA0X3d0X25vblNoaEBtZXRhLmRhdGEkcmVzLjEuNixmcm9tPWMoIjAiLCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjIwIiwiMjEiLCIyMiIsIjIzIiwiMjQiLCIyNSIsIjI2IiwiMjciLCIyOCIsIjI5IiwiMzAiLCIzMSIsIjMyIiksdG89YygiRmlicm9ibGFzdCIsIkN5Y2xpbmdGaWJyb2JsYXN0IiwiQ2hvbmRyb2N5dGUiLCJGaWJyb2JsYXN0IiwiRmlicm9ibGFzdCIsIkZpYnJvYmxhc3QiLCJGaWJyb2JsYXN0IiwiRmlicm9ibGFzdCIsIkZpYnJvYmxhc3QiLCJGaWJyb2JsYXN0IiwiQ3ljbGluZ0ZpYnJvYmxhc3QiLCJJbW11bmVfMSIsIkN5Y2xpbmdGaWJyb2JsYXN0IiwiTXVzY2xlIiwiRmlicm9ibGFzdCIsIlZhc2N1bGFyRW5kb3RoZWxpYWwiLCJNdXNjbGUiLCJNZXNlbmNoeW1hbFByb2dlbml0b3IiLCJGaWJyb2JsYXN0IiwiQ2hvbmRyb2N5dGUiLCJJbW11bmVfMiIsIkNob25kcm9jeXRlIiwiQ3ljbGluZ0ZpYnJvYmxhc3QiLCJMeW1waGF0aWNFbmRvdGhlbGlhbCIsIk11c2NsZSIsIk1lc2VuY2h5bWFsUHJvZ2VuaXRvciIsIk1lc2VuY2h5bWFsUHJvZ2VuaXRvciIsIlNjaHdhbm5DZWxsIiwiTWVzZW5jaHltYWxQcm9nZW5pdG9yIiwiVlNNQy9wZXJpY3l0ZSIsIk11c2NsZSIsIlJCQyIsIk5ldXJvbi9ORUMiKSkKYGBgCmBgYHtyfQp3dF9ub25TaGhfY2VsbFR5cGUxLjY8LUUxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSRjZWxsX3R5cGVfMS42Cm5hbWVzKHd0X25vblNoaF9jZWxsVHlwZTEuNik8LUUxNUUxNlAxUDRfd3Rfbm9uU2hoQGNlbGwubmFtZXMKYGBgCgpgYGB7cn0Kc2F2ZShFMTVFMTZQMVA0X3d0X25vblNoaCxmaWxlPSJzZXVyYXRFMTVFMTZQMVA0X3d0X25vblNoaC5SRGF0YSIpCmBgYAoKYGBge3J9CiNsb2FkKCJzZXVyYXRFMTVFMTZQMVA0X3d0X25vblNoaC5SRGF0YSIpCmBgYAoKYGBge3IsZmlnLmhlaWdodD0xOCxmaWcud2lkdGg9NjB9CgpEb0hlYXRtYXAob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGdlbmVzLnVzZSA9IGMoIlNveDkiLCJBY2FuIiwiQ29sMmExIiwiQWN0YTIiLCJUYWdsbiIsIk15aDExIiwiUHBwMXIxNGEiLCJSZ3M1IiwiTm90Y2gzIiwiV250MiIsIlRlayIsIlRlayIsIkx5NmEiLCJUaHkxIiwiUGVjYW0xIiwiTHl2ZTEiLCJGY2VyMWciLCJDMXFhIiwiQ2QzZyIsIlBscDEiLCJNcHoiLCJBc2NsMSIsIkNoZ2EiLCJTbmFwMjUiLCJNa2k2NyIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0iY2VsbF90eXBlXzEuNiIsZ3JvdXAuY2V4ID0gNDAsY2V4LnJvdz0zNSxncm91cC5vcmRlciA9IGMoIkNob25kcm9jeXRlIiwiRmlicm9ibGFzdCIsIkN5Y2xpbmdGaWJyb2JsYXN0IiwiTXVzY2xlIiwiVlNNQy9wZXJpY3l0ZSIsIk1lc2VuY2h5bWFsUHJvZ2VuaXRvciIsIkx5bXBoYXRpY0VuZG90aGVsaWFsIiwiVmFzY3VsYXJFbmRvdGhlbGlhbCIsIkltbXVuZV8xIiwiSW1tdW5lXzIiLCJTY2h3YW5uQ2VsbCIsIk5ldXJvbi9ORUMiKSxjZWxscy51c2U9RTE1RTE2UDFQNF93dF9ub25TaGhAY2VsbC5uYW1lc1shKEUxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSRyZXMuMS42ICVpbiUgYygzMSkpXSkKYGBgCiMjIyMjIEZvciB0aGUgcHVycG9zZSBvZiB2aXN1YWxpemF0aW9uLCB3ZSBhdmVyYWdlIHdpdGhpbiBlYWNoIGNlbGwgdHlwZToKCmBgYHtyfQpFMTVFMTZQMVA0X3d0X25vblNoaDwtU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGlkID0gImNlbGxfdHlwZV8xLjYiKQphdmVyYWdlX3d0X25vblNoaF9yZXMxLjZfQW5ub3RhdGlvbjwtQXZlcmFnZUV4cHJlc3Npb24ob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgscmV0dXJuLnNldXJhdCA9IFQpCmBgYApgYGB7cixmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTd9CgpEb0hlYXRtYXAob2JqZWN0ID0gYXZlcmFnZV93dF9ub25TaGhfcmVzMS42X0Fubm90YXRpb24sIGdlbmVzLnVzZSA9IGMoIlNveDkiLCJBY2FuIiwiQ29sMmExIiwiVHdpc3QyIiwiQWN0YTIiLCJUYWdsbiIsIk15aDExIiwiUHBwMXIxNGEiLCJSZ3M1IiwiTm90Y2gzIiwiV250MiIsIlRlayIsIlRlayIsIkx5NmEiLCJUaHkxIiwiUGVjYW0xIiwiTHl2ZTEiLCJGY2VyMWciLCJDMXFhIiwiQ2QzZyIsIlBscDEiLCJNcHoiLCJBc2NsMSIsIkNoZ2EiLCJTbmFwMjUiLCJNa2k2NyIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5jZXggPSAyNSxjZXgucm93PTEyLGdyb3VwLm9yZGVyID0gYygiQ2hvbmRyb2N5dGUiLCJGaWJyb2JsYXN0IiwiQ3ljbGluZ0ZpYnJvYmxhc3QiLCJNdXNjbGUiLCJWU01DL3BlcmljeXRlIiwiTWVzZW5jaHltYWxQcm9nZW5pdG9yIiwiTHltcGhhdGljRW5kb3RoZWxpYWwiLCJWYXNjdWxhckVuZG90aGVsaWFsIiwiSW1tdW5lXzEiLCJJbW11bmVfMiIsIlNjaHdhbm5DZWxsIiwiTmV1cm9uL05FQyIpLGNlbGxzLnVzZT1hdmVyYWdlX3d0X25vblNoaF9yZXMxLjZfQW5ub3RhdGlvbkBjZWxsLm5hbWVzWyEoYXZlcmFnZV93dF9ub25TaGhfcmVzMS42X0Fubm90YXRpb25AY2VsbC5uYW1lcyAlaW4lIGMoIlJCQyIpKV0pCmBgYApgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTV9CmdncGxvdChkYXRhPUUxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YVshKEUxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSRyZXMuMS42ICVpbiUgYygzMSkpLF0sYWVzKGFnZSxmaWxsPWNlbGxfdHlwZV8xLjYpKSsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpgYGAKYGBge3J9CnRhYmxlKEUxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSRhZ2VbIShFMTVFMTZQMVA0X3d0X25vblNoaEBtZXRhLmRhdGEkcmVzLjEuNiAlaW4lIGMoMzEpKV0sRTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhJGNlbGxfdHlwZV8xLjZbIShFMTVFMTZQMVA0X3d0X25vblNoaEBtZXRhLmRhdGEkcmVzLjEuNiAlaW4lIGMoMzEpKV0pCmBgYAoKIyMjIyMgbmV1cm9uL05FQywgYW5kIGlmIHRoZXkgYXJlIGZyb20gRTE1IG9yIFA0LCBhcmUgdGhleSBmcm9tIFNoaCBsaW5lYWdlIChpZiBmcm9tIFNoaCBsaW5lYWdlLCB0aGV5IHNob3VsZCBiZSBjYXB0dXJlZCBpbiB0aGUgImdyZWVuIiBnYXRlKToKIyMjIyMgc2NhbGVkIGRhdGE6CmBgYHtyLGZpZy5oZWlnaHQ9MyxmaWcud2lkdGg9MTB9CgpEb0hlYXRtYXAob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiU25hcDI1IiwiVHViYjMiLCJDaGdhIiwiQXNjbDEiLCJSZXQiLCJJbnNtMSIsIlBob3gyYSIsIlBob3gyYiIsIk1weiIsIlNveDEwIiwiU2hoIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJnYXRlIixncm91cC5jZXggPSAzMCxjZXgucm93PTE2LGNlbGxzLnVzZT1FMTVFMTZQMVA0X3d0X25vblNoaEBjZWxsLm5hbWVzW0UxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSRjZWxsX3R5cGVfMS42ICVpbiUgYygiTmV1cm9uL05FQyIpXSkKYGBgCiMjIyMjIHVuc2NhbGVkIGRhdGE6CmBgYHtyLGZpZy5oZWlnaHQ9MyxmaWcud2lkdGg9MTB9CgpEb0hlYXRtYXAob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiU25hcDI1IiwiVHViYjMiLCJDaGdhIiwiQXNjbDEiLCJSZXQiLCJJbnNtMSIsIlBob3gyYSIsIlBob3gyYiIsIk1weiIsIlNveDEwIiwiU2hoIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBGLGdyb3VwLmJ5PSJnYXRlIixncm91cC5jZXggPSAzMCxjZXgucm93PTEyLGNlbGxzLnVzZT1FMTVFMTZQMVA0X3d0X25vblNoaEBjZWxsLm5hbWVzW0UxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSRjZWxsX3R5cGVfMS42ICVpbiUgYygiTmV1cm9uL05FQyIpXSkKYGBgCiMjIyMjIFNjaHdhbm4gY2VsbDoKYGBge3IsZmlnLmhlaWdodD0zLGZpZy53aWR0aD0xMH0KCkRvSGVhdG1hcChvYmplY3QgPSBFMTVFMTZQMVA0X3d0X25vblNoaCwgZ2VuZXMudXNlID0gYygiU294MTAiLCJHYXA0MyIsIkJsYnAiLCJNcHoiLCJEaGgiLCJQNzVudHIiLCJTMTAwIiwiRWdyMiIsIk1icCIsIk5jYW0xIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJhZ2UiLGdyb3VwLmNleCA9IDMwLGNleC5yb3c9MTYsY2VsbHMudXNlPUUxNUUxNlAxUDRfd3Rfbm9uU2hoQGNlbGwubmFtZXNbRTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhJGNlbGxfdHlwZV8xLjYgJWluJSBjKCJTY2h3YW5uQ2VsbCIpXSkKYGBgCgojIyMjIyBzb21lIGxpbmVhZ2UgbWFya2VyczoKYGBge3IsZmlnLmhlaWdodD0yMCxmaWcud2lkdGg9MjB9ClZsblBsb3Qob2JqZWN0ID0gRTE1RTE2UDFQNF93dF9ub25TaGgsIGZlYXR1cmVzLnBsb3QgPSBjKCJTb3gxMCIsIk1weiIsIlNoaCIsIlBob3gyYSIsIlBob3gyYiIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0iY2VsbF90eXBlXzEuNiIpCgpgYGAKIyMjIyMgQ2hvbmRyb2N5dGVzIGFjcm9zcyB0aW1lOgpgYGB7cixmaWcuaGVpZ2h0PTEyLGZpZy53aWR0aD01MH0KCkRvSGVhdG1hcChvYmplY3QgPSBFMTVFMTZQMVA0X3d0X25vblNoaCwgZ2VuZXMudXNlID0gYygiQ29sMTFhMSIsIk1pYSIsIlNveDkiLCJTb3g1IiwiU294NiIsIkFjYW4iLCJDb2wyYTEiLCJNc3gyIiwiTGVjdDEiLCJIb3hhNSIsIlRvcDJhIiwiTWtpNjciLCJSdW54MSIsIlJ1bngyIiwiQ29sOGExIiwiQ29sOGEyIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJyZXMuMS42Iixncm91cC5jZXggPSA0NSxjZXgucm93PTQwLGNlbGxzLnVzZT1FMTVFMTZQMVA0X3d0X25vblNoaEBjZWxsLm5hbWVzW0UxNUUxNlAxUDRfd3Rfbm9uU2hoQG1ldGEuZGF0YSRjZWxsX3R5cGVfMS42ICVpbiUgYygiQ2hvbmRyb2N5dGUiKV0sZ3JvdXAub3JkZXIgPSBjKDE5LDIxLDIpKQpgYGAKCgpgYGB7cn0KbGlicmFyeShnZ2FsbHV2aWFsKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00fQpnZ3Bsb3QoZGF0YT1FMTVFMTZQMVA0X3d0X25vblNoaEBtZXRhLmRhdGFbRTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhJHJlcy4xLjYgJWluJSBjKCIxOSIsIjIxIiwiMiIpLF0sYWVzKGF4aXMxPXJlcy4xLjYsYXhpczI9YWdlKSkrZ2VvbV9hbGx1dml1bShhZXMoZmlsbD1hZ2UpKStnZW9tX3N0cmF0dW0od2lkdGggPSAxLzEyLCBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiZ3JleSIpICtnZW9tX2xhYmVsKHN0YXQgPSAic3RyYXR1bSIsIGxhYmVsLnN0cmF0YSA9IFRSVUUpK3NjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygicmVzLjEuNiIsICJhZ2UiKSwgZXhwYW5kID0gYyguMDUsIC4wNSkpCmBgYAojIyMjIyBEb24ndCBleHBlY3QgYSBsb3Qgb2YgQ29sMTBhMSBvciBNbXAxMzoKYGBge3IsZmlnLmhlaWdodD02LGZpZy53aWR0aD0xMn0KVmxuUGxvdChvYmplY3QgPSBFMTVFMTZQMVA0X3d0X25vblNoaCwgZmVhdHVyZXMucGxvdCA9IGMoIkNvbDEwYTEiLCJNbXAxMyIpLCBuQ29sID0gMix4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0iY2VsbF90eXBlXzEuNiIpCgpgYGAKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD01fQpWbG5QbG90KG9iamVjdCA9IEUxNUUxNlAxUDRfd3Rfbm9uU2hoLCBmZWF0dXJlcy5wbG90ID0gYygib3JpZy5DZWxsQ3ljbGVfc2NvcmUiKSwgbkNvbCA9IDMseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9ImFnZSIsaWRlbnQuaW5jbHVkZSA9IGMoMTksMiwyMSkpCgpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9MjAsIGZpZy53aWR0aD0xNn0KZ2dwbG90KGRhdGE9RTE1RTE2UDFQNF93dF9ub25TaGhAbWV0YS5kYXRhLGFlcyhheGlzMT1vcmlnLjEuNCxheGlzMj1yZXMuMS42LGF4aXMzPWNlbGxfdHlwZV8xLjYpKStnZW9tX2FsbHV2aXVtKGFlcyhmaWxsPXJlcy4xLjYpKStnZW9tX3N0cmF0dW0od2lkdGggPSAxLzEyLCBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiZ3JleSIpICtnZW9tX2xhYmVsKHN0YXQgPSAic3RyYXR1bSIsIGxhYmVsLnN0cmF0YSA9IFRSVUUpK3NjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygib3JpZy4xLjQiLCAicmVzLjEuNiIsImNlbGxfdHlwZV8xLjYiKSwgZXhwYW5kID0gYyguMDUsIC4wNSkpCmBgYApgYGB7ciwgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTEwfQpnZ3Bsb3QoZGF0YT1FMTVFMTZQMVA0X3d0X25vblNoaEBtZXRhLmRhdGEsYWVzKGF4aXMxPW9yaWcuMS40LGF4aXMyPWNlbGxfdHlwZV8xLjYpKStnZW9tX2FsbHV2aXVtKGFlcyhmaWxsPWNlbGxfdHlwZV8xLjYpKStnZW9tX3N0cmF0dW0od2lkdGggPSAxLzEyLCBmaWxsID0gImJsYWNrIiwgY29sb3IgPSAiZ3JleSIpICtnZW9tX2xhYmVsKHN0YXQgPSAic3RyYXR1bSIsIGxhYmVsLnN0cmF0YSA9IFRSVUUpK3NjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygib3JpZy4xLjQiLCAicmVzLjEuNiIpLCBleHBhbmQgPSBjKC4wNSwgLjA1KSkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==